package cn.edu.jnu.x2022103548;  // 替换为你的实际包名

public class Game {
    private final int[] rolls = new int[21]; // 存储投掷记录
    private int currentRoll = 0;

    public void roll(int pins) {
        rolls[currentRoll++] = pins;
    }

    public int score() {
        int score = 0;
        int frameIndex = 0;

        for (int frame = 0; frame < 10; frame++) {
            if (isStrike(frameIndex)) {
                // 全中：10分 + 下两球奖励
                score += 10 + strikeBonus(frameIndex);
                frameIndex += 1; // 全中只占1个投掷位
            } else if (isSpare(frameIndex)) {
                // 补中：10分 + 下一球奖励
                score += 10 + spareBonus(frameIndex);
                frameIndex += 2;
            } else {
                // 普通帧：两球之和
                score += sumOfBallsInFrame(frameIndex);
                frameIndex += 2;
            }
        }
        return score;
    }

    // === 辅助方法 ===
    private boolean isStrike(int frameIndex) {
        return rolls[frameIndex] == 10;
    }

    private boolean isSpare(int frameIndex) {
        return rolls[frameIndex] + rolls[frameIndex + 1] == 10;
    }

    private int sumOfBallsInFrame(int frameIndex) {
        return rolls[frameIndex] + rolls[frameIndex + 1];
    }

    private int spareBonus(int frameIndex) {
        return rolls[frameIndex + 2];
    }

    private int strikeBonus(int frameIndex) {
        return rolls[frameIndex + 1] + rolls[frameIndex + 2];
    }
}